home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 011 / escplus.asm < prev    next >
Assembly Source File  |  1985-06-03  |  5KB  |  172 lines

  1.         name ESCPLUS
  2.         page 60,132
  3.         title 'ESCPLUS--send an escape sequence to LPT1'
  4.  
  5.  
  6.     ;This program sends and escape code (ASCII 27)
  7.     ;and up to two other characters to LPT1.
  8.     ;The characters to be sent are given to this
  9.     ;program from the command line.  If no 
  10.     ;arguments are given, instructions are printed
  11.     ;on the screen.
  12.  
  13.  
  14.     ;Assemble this program with the IBM Assembler
  15.     ;then link it, then run exe2bin and make it a
  16.     ;com file (i.e. EXE2BIN ESCPLUS ESCPLUS.COM)
  17.  
  18.     ;ESCPLUS--Written by Harry Logan
  19.     ;March 13, 1984. This program has been given
  20.     ;to the world!
  21.     ;Version 2.1 --> Last One!! (ha ha ha!)
  22.  
  23.  
  24.  
  25.  
  26.  
  27.         cr equ 13        ;carrige return
  28.         lf equ 10        ;line feed
  29.         escape equ 27        ;escape (ASCII 027)
  30.         eom equ 24h        ;end of message ($)
  31.  
  32.  
  33.  
  34.  
  35.     cseg    segment para public 'CODE'
  36.         assume cs:cseg,ds:cseg,es:nothing,ss:nothing
  37.         org    $+0100h        ;make this a com file
  38.  
  39.     start:    jmp    begin
  40.         ;Set-up messages
  41.     msg1    db    'Escape character plus--> ',eom
  42.     msg2    db    ' <--sent to LPT1:',cr,lf,eom
  43.     code1    db    ?
  44.     code2    db    ?
  45.     ;error messages--#1 is no command line arguments
  46.     errmsg1    db    'This program sends an escape'
  47.         db    ' character plus up to 2 other',cr,lf
  48.         db    'characters of your choice'
  49.         db    ' (transmitted to this program via',cr,lf
  50.         db    'the command line) to LPT1:',cr,lf
  51.         db    'i.e. ESCPLUS char1 char2',cr,lf,eom
  52.     errmsg2    db    'Printer not responding',cr,lf
  53.         db    'Aborting',cr,lf,eom
  54.     ;Copyright message (not used)
  55.     copyrte    db    'Copyright 1984-Harry Logan',cr,lf
  56.         db    'All rights reserved--Version 2.1',cr,lf,eom
  57.     ;end of messages
  58.  
  59.  
  60.     begin:            ;let's start
  61.         push ds        ;save ds for return to DOS
  62.         xor ax,ax    ;clear a reg
  63.         push ax        ;and save it
  64.         call getchar    ;go process command line
  65.     ;start the procedure
  66.         push bx        ;let's make sure we have it
  67.         cmp bx,0    ;no command line?
  68.         je nocmmd    ;print instuctions and exit
  69.     ;check and make sure the printer is okay
  70.         mov dx,0    ;we want lpt1
  71.         mov ah,2    ;id for printer status
  72.         int 17h        ;call DOS
  73.         cmp ah,144    ;is everything cool?
  74.         jne lpterr    ;no, exit gracefully
  75.         mov dl,escape    ;put ASCII 27 in dl
  76.         mov ah,5    ;id for DOS
  77.         int 21h        ;call DOS to do the work
  78.         mov dl,code1    ;First character
  79.         mov ah,5    ;Make sure it's the same
  80.         int 21h        ;call DOS and send it
  81.         cmp bx,1    ;another character?
  82.         je  bye        ;no, go say good-bye
  83.         mov dl,code2    ;otherwise get second character
  84.         mov ah,5    ;make sure again
  85.         int 21h        ;Call DOS and send it
  86.     bye:            ;successful--say good-bye
  87.         mov dx,offset msg1    ;point to first msg
  88.         mov ah,9    ;id number
  89.         int 21h        ;call DOS
  90.         mov dl,code1    ;First code for verification
  91.         mov ah,2    ;id number (display character)
  92.         int 21h        ;DOS!!!
  93.         pop bx        ;get it back
  94.         cmp bx,1    ;is there 2 args?
  95.         je bye2        ;nope
  96.         mov dl,code2    ;2nd code for verification
  97.         mov ah,2    ;id number
  98.         int 21h        ;DOS again
  99.     bye2:    mov dx,offset msg2    ;end of message
  100.         mov ah,9    ;id number
  101.         int 21h        ;DOS again
  102.         jmp exit    ;done!
  103.     nocmmd:            ;no command line
  104.         mov dx,offset errmsg1    ;point to 1st error message
  105.         mov ah,9    ;id number
  106.         int 21h        ;call DOS
  107.         jmp exit    ;done!
  108.  
  109.     lpterr:            ;printer error
  110.         pop bx        ;get this off the stack
  111.         mov dx,offset errmsg2    ;point to 2nd error message
  112.         mov ah,9    ;id number
  113.         int 21h        ;call DOS
  114.     exit:            ;we're all done
  115.         ret        ;far return to DOS
  116.  
  117.  
  118.     getchar      proc   near    ;process command line
  119.           ;returns code1, code2 (if there is)
  120.           ;and puts 0, 1, or 2 in bx depending on number
  121.           ;of command line arguments. (0 args jumps
  122.           ;to nocmmd after return
  123.  
  124.         mov si,80h    ;point to the number of args
  125.         mov cl,[si]    ;move it to a reg
  126.         cmp cl,0    ;no args?
  127.         je  noargs    ;oops--print some instructions
  128.         cmp cl,1    ;just a space?
  129.         je noargs    ;yes, so no arguments
  130.         cmp cl,2    ;one arg?
  131.         je onearg    ;go process it
  132.         jmp twoargs    ;otherwise there must be two--ignore all others
  133.     noargs:            ;no args, put 0 in bx
  134.         mov bx,0    ;put 0 in bx
  135.         ret        ;and return
  136.     onearg:    mov di,offset code1    ;create a space
  137.     arg1:    inc si        ;ignore leading blanks
  138.         mov al,[si]    ;move it to a reg
  139.         cmp al,' '    ;check for space
  140.         je  arg1    ;loop
  141.         mov [di],al    ;copy it to code1
  142.         mov bx,1    ;tell caller only one arg
  143.         ret        ;and return
  144.      twoargs:    mov di,offset code1    ;create a space
  145.      arg2:    inc si
  146.         mov al,[si]    ;same as above^
  147.         cmp al,' '    ;check for space
  148.         je arg2        ;loop till we get a character
  149.         mov [di],al    ;move it to code1
  150.         mov di,offset code2    ;point to second arg space
  151.     ttws:    inc si        ;ignore second space
  152.         mov al,[si]    ;move it to a reg
  153.         cmp al,' '    ;another space?
  154.         je ttws        ;go back and loop
  155.         mov [di],al    ;put it in our space
  156.         mov bx,2    ;tell caller there's 2 args
  157.         ret        ;and return
  158.  
  159.     getchar        endp
  160.  
  161.     cseg        ends
  162.             end start
  163.  
  164.  caller there's 2 args
  165.         ret        ;and return
  166.  
  167.     getchar        endp
  168.  
  169.     cseg        ends
  170.             end start
  171.  
  172.